# -*- coding: utf-8 -*-
"""
@Time    : 2024/6/29 11:25 
@Author  : ZhangShenao 
@File    : json_serialization.py
@Desc    : 使用Python内置的json模块,实现json的序列化、反序列化操作
"""
import json


class User:
    """用户类"""

    def __init__(self, name: str, age: int, hobbies: list):
        """构造函数"""
        self.name = name
        self.age = age
        self.hobbies = hobbies

    def __str__(self):
        """打印用户信息"""
        return f'姓名:{self.name},年龄:{self.age},爱好:{self.hobbies}'


def user_to_dict(user: User):
    """将User对象属性转换成dict,便于json序列化"""
    return {
        'name': user.name,
        'age': user.age,
        'hobbies': user.hobbies
    }


def dict_to_user(data: dict) -> User:
    """将dict转换为User对象,便于json反序列化"""
    return User(name=data['name'],
                age=data['age'],
                hobbies=data['hobbies'])


def json_serialize():
    """将对象json序列化到文件中"""

    # 创建User对象
    user = User(name='zsa', age=18, hobbies=['唱歌', '打篮球', '写代码'])

    # 打开文件并写入
    with open('user.json', 'w') as f:
        # 使用json模块的dump()函数,将对象序列化,并写入文件中
        json.dump(user,
                  f,
                  ensure_ascii=False,  # 确保非ASCII字符(如中文)可以正确显示
                  indent=4,  # 美化JSON输出格式,使其更具可读性
                  default=user_to_dict  # 指定对象的序列化方式
                  )

    print('序列化完成')


def json_deserialize():
    """将文件中的json反序列化为对象"""
    # 打开文件并读取
    with open('user.json', 'r') as f:
        # 使用json模块的load()函数,将文件中的json内容反序列化为对象
        user = json.load(f, object_hook=dict_to_user)
        print('反序列化完成,对象信息如下:')
        print(user)


if __name__ == '__main__':
    # 序列化
    json_serialize()

    # 反序列化
    json_deserialize()
